• HDU-6186-CS Course(前缀和+后缀和+位运算)


    CS Course

    Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 3807 Accepted Submission(s): 1412

    Problem Description

    Little A has come to college and majored in Computer and Science.

    Today he has learned bit-operations in Algorithm Lessons, and he got a problem as homework.

    Here is the problem:

    You are giving n non-negative integers a1,a2,⋯,an, and some queries.

    A query only contains a positive integer p, which means you
    are asked to answer the result of bit-operations (and, or, xor) of all the integers except ap.

    Input

    There are no more than 15 test cases.

    Each test case begins with two positive integers n and p
    in a line, indicate the number of positive integers and the number of queries.

    2≤n,q≤105

    Then n non-negative integers a1,a2,⋯,an follows in a line, 0≤ai≤109 for each i in range[1,n].

    After that there are q positive integers p1,p2,⋯,pqin q lines, 1≤pi≤n for each i in range[1,q].

    Output
    For each query p, output three non-negative integers indicates the result of bit-operations(and, or, xor) of all non-negative integers except ap in a line.

    Sample Input

    3 3
    1 1 1
    1
    2
    3

    Sample Output

    1 1 0
    1 1 0
    1 1 0

    时间限制:4000/2000 MS(Java /其他)内存限制:32768/32768 K(Java /其他)
    提交总数:3807接受提交:1412

    问题描述
    Little A上了大学,主修计算机和科学。

    如今,他已经在算法课程中学习了位操作,并且在作业方面遇到了问题。

    这是问题所在:

    您要提供n个非负整数a1,a2,⋯,an和一些查询。

    查询仅包含一个正整数p,这意味着您
    要求回答除ap以外的所有整数的位运算(和,或xor)的结果。

    输入值
    测试案例不超过15个。

    每个测试用例均以两个正整数n和p开头
    在一行中,指示正整数的数量和查询的数量。

    2≤n,q≤105

    然后,n个非负整数a1,a2,⋯,an排成一行,对于范围[1,n]中的每个i,0≤ai≤109。

    之后,在q行中有q个正整数p1,p2,⋯,pqin,范围[1,q]中的每个i1≤pi≤n。

    输出量
    对于每个查询p,输出三个非负整数表示一行中除ap之外的所有非负整数的位运算(和或xor)的结果。

    样本输入
    3 3
    1 1 1
    1
    2
    3

    样本输出
    1 1 0
    1 1 0
    1 1 0
    题目链接
    WFU寒假训练<十一>
    这道是杭电OJ中的题目 依次输出从除ap外的所有非负整数的位运算(和或xor)的结果(我做的时候暴力TLE了好几次)
    本题思路:定义6个数组,预处理前缀和和后缀和,输出的时候注意等于1和等于n的情况,其他情况根据前缀和和后缀和输出答案即可
    ac代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int _max=1e5+50;
    int num[_max];
    int an[_max],huo[_max],xo[_max];//前缀和
    int rean[_max],rehuo[_max],rexo[_max];//后缀和
    int n,q;
    int main()
    {
    	ios::sync_with_stdio(false);
    	void solve();
    	while(cin>>n>>q)//不多组输入会WA
    	{
    	  for(int i=1;i<=n;i++)
    	  cin>>num[i];
    	  solve();//预处理函数
    	  for(int i=1;i<=q;i++)
         	{
         		int s;
         		cin>>s;
         		if(s==1)//特殊情况
         		  cout<<rean[s+1]<<" "<<rehuo[s+1]<<" "<<rexo[s+1]<<endl;
           		else if(s==n)//特殊情况
    	     	  cout<<an[s-1]<<" "<<huo[s-1]<<" "<<xo[s-1]<<endl;
    	    	else
    	    	  cout<<(an[s-1]&rean[s+1])<<" "<<(huo[s-1]|rehuo[s+1])<<" "<<(xo[s-1]^rexo[s+1])<<endl;
    	    }
    	}
    	
    	return 0;
    }
    void solve()
    {
    	an[1]=huo[1]=xo[1]=num[1];
    	for(int i=2;i<=n;i++)
    	{
    		an[i]=an[i-1]&num[i];
    		huo[i]=huo[i-1]|num[i];
    		xo[i]=xo[i-1]^num[i];
    	}
    	rean[n]=rehuo[n]=rexo[n]=num[n];
    	for(int i=n-1;i>=1;i--)
    	{
    		rean[i]=rean[i+1]&num[i];
    		rehuo[i]=rehuo[i+1]|num[i];
    		rexo[i]=rexo[i+1]^num[i];
    	}
    }
    
  • 相关阅读:
    Windows环境下Unicode编程总结
    我的CS脚本autoexec.cfg
    完成端口与高性能服务器程序开发[引用]
    调用未知DLL中的导出函数
    兼容Vista 赛门铁克公测新杀毒软件
    I Love You的真正含义
    码根码
    木马经典十大藏身地点大搜查
    Windows调试器及不同平台符号包下载地址(收集)
    “千般路”与“磨豆腐”
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294338.html
Copyright © 2020-2023  润新知