• HDU 5475:An easy problem 这题也能用线段树做???


    An easy problem

    Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 467    Accepted Submission(s): 258


    Problem Description
    One day, a useless calculator was being built by Kuros. Let's assume that number X is showed on the screen of calculator. At first, X = 1. This calculator only supports two types of operation.
    1. multiply X with a number.
    2. divide X with a number which was multiplied before.
    After each operation, please output the number X modulo M.
     

    Input
    The first line is an integer T(1T10), indicating the number of test cases.
    For each test case, the first line are two integers Q and M. Q is the number of operations and M is described above. (1Q105,1M109)
    The next Q lines, each line starts with an integer x indicating the type of operation.
    if x is 1, an integer y is given, indicating the number to multiply. (0<y109)
    if x is 2, an integer n is given. The calculator will divide the number which is multiplied in the nth operation. (the nth operation must be a type 1 operation.)

    It's guaranteed that in type 2 operation, there won't be two same n.
     

    Output
    For each test case, the first line, please output "Case #x:" and x is the id of the test cases starting from 1.
    Then Q lines follow, each line please output an answer showed by the calculator.
     

    Sample Input
    1 10 1000000000 1 2 2 1 1 2 1 10 2 3 2 4 1 6 1 7 1 12 2 7
     

    Sample Output
    Case #1: 2 1 2 20 10 1 6 42 504 84

    题意是一台计算器,最开始的数字是1,然后对其不断操作,输入的操作为1时,乘以后面的数y。输入的操作为2时,除以第y次操作的数。问每一次操作后的结果是多少。

    哇,这题居然是线段树做法,真的是没想到啊,发现线段树的题竟然这么广。

    对每一个定点进行更新,对整个线段树求乘积。

    代码:

    #include <iostream>  
    #include <algorithm>  
    #include <cmath>  
    #include <vector>  
    #include <string>  
    #include <cstring>  
    #pragma warning(disable:4996)  
    using namespace std;
    
    struct no
    {
    	int L,R;
    	long long mul;
    }tree[400015];
    
    int root,n;
    long long mod;
    
    void buildtree(int root,int L,int R)
    {
    	tree[root].L=L;
    	tree[root].R=R;
    
    	tree[root].mul=1;
    
    	if(L!=R)
    	{
    		buildtree(root*2+1,L,(L+R)/2);
    		buildtree(root*2+2,(L+R)/2+1,R);
    	}
    }
    
    void insert(int root,int s,int e,long long val)
    {
    	if(tree[root].L==s&&tree[root].R==e)
    	{
    		tree[root].mul=val%mod;
    		return;
    	}
    	if(e<=(tree[root].L+tree[root].R)/2)
    	{
    		insert(root*2+1,s,e,val);
    	}
    	else if(s>=(tree[root].L+tree[root].R)/2+1)
    	{
    		insert(root*2+2,s,e,val);
    	}
    	else
    	{
    		insert(root*2+1,s,(tree[root].L+tree[root].R)/2,val);
    		insert(root*2+2,(tree[root].L+tree[root].R)/2+1,e,val);
    	}
    	tree[root].mul = (tree[2*root+1].mul *  tree[2*root+2].mul)%mod;
    }
    
    int main()
    {
    	//freopen("i.txt","r",stdin);
    	//freopen("o.txt","w",stdout);
    
    	int test,i,j,oper;
    	long long val;
    	scanf("%d",&test);
    	
    	for(i=1;i<=test;i++)
    	{
    		printf("Case #%d:
    ",i);
    		scanf("%d%lld",&n,&mod);
    
    		buildtree(0,1,n);
    		for(j=1;j<=n;j++)
    		{
    			scanf("%d%lld",&oper,&val);
    			if(oper==1)
    			{
    				insert(0,j,j,val);
    			}
    			else
    			{
    				insert(0,val,val,1);
    			}
    			printf("%lld
    ",tree[0].mul);
    		}
    	}
    	//system("pause");
    	return 0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    1055. [HAOI2008]玩具取名【区间DP】
    BZOJ2435:[NOI2011]道路修建 (差分)
    1084. [SCOI2005]最大子矩阵【网格DP】
    1060. [ZJOI2007]时态同步【树形DP】
    1050. [HAOI2006]旅行【并查集+枚举】
    2463. [中山市选2009]谁能赢呢?【博弈论】
    luogu P1195 口袋的天空
    luogu P1162 填涂颜色
    luogu P1223 排队接水
    luogu P1331 海战
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899557.html
Copyright © 2020-2023  润新知