HDU - 6186 CS Course(维护前缀+后缀)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 6186 CS Course(维护前缀+后缀)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出n個數以及m個查詢,每個查詢包括一個數字,要求輸出除了該數字之外的位運算的“或和”,“與和”和“異或和”
題目分析:對于異或操作,我們可以在輸入的時候就儲存一下所有數的異或值,在詢問時對于該數字再異或一下就是答案了
對于與和或操作,我們可以儲存一下前綴和后綴,在詢問的時候,除了該數字之外的前綴和后綴再位運算一下即可,注意對第一個數字和最后一個數字詢問時的特殊處理一下即可
代碼:
#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cstring> #include<algorithm> #include<stack> #include<queue> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;int a[N];int sa[N],sb[N];int ea[N],eb[N];int main() { // freopen("input.txt","r",stdin);int n,m;while(scanf("%d%d",&n,&m)!=EOF){int XOR=0;for(int i=1;i<=n;i++){scanf("%d",a+i);XOR^=a[i];}sa[1]=sb[1]=a[1];for(int i=2;i<=n;i++){sa[i]=sa[i-1]&a[i];sb[i]=sb[i-1]|a[i];}ea[n]=eb[n]=a[n];for(int i=n-1;i>=1;i--){ea[i]=ea[i+1]&a[i];eb[i]=eb[i+1]|a[i];}while(m--){int num;scanf("%d",&num);if(num==1)printf("%d %d %d\n",ea[2],eb[2],XOR^a[1]);else if(num==n)printf("%d %d %d\n",sa[n-1],sb[n-1],XOR^a[n]);elseprintf("%d %d %d\n",sa[num-1]&ea[num+1],sb[num-1]|eb[num+1],XOR^a[num]);}}return 0; }?
總結
以上是生活随笔為你收集整理的HDU - 6186 CS Course(维护前缀+后缀)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gym - 101972A Multip
- 下一篇: CodeForces - 715A Pl