#include <iostream> #include <vector> using namespace std; struct node{ int left; int right; bool isColored; }; int log2(int temp){ int log = 0; bool isok = true; while(temp!= 0){ if(temp%2 == 1 && temp!=1) isok = false; temp = temp/2; log++; } if (isok)log--; return log; } int pot2(int b){ int a=2; if (b==0){ return 1; } else if (b%2 == 0){ int w = pot2(b/2); w = w*w; return w; } else{ int w = pot2(b-1); w = a*w; return w; } } void createTree(vector<node> &A, int i){ A[i].isColored = false; if(i >= A.size()/2){ A[i].left = i; A[i].right = i; } else{ createTree(A,2*i); createTree(A, 2*i +1); A[i].left = A[2*i].left; A[i].right = A[2*i+1].right; } } void paintInterval(vector<node> &A, int i, int targetLeft, int targetRight){ if(A[i].left > targetRight || A[i].right < targetLeft) return; if(targetLeft <= A[i].left && targetRight >= A[i].right){ A[i].isColored = true; return; } int center = (A[i].left + A[i].right)/2; if(targetLeft <= center) paintInterval(A,2*i,targetLeft,targetRight); if(targetRight > center) paintInterval(A,2*i + 1,targetLeft,targetRight); } void updateTree(vector<node> &A, int i){ if(i<A.size()/2){ if(A[i].isColored == 1){ A[2*i].isColored = 1; A[2*i + 1].isColored = 1; } updateTree(A,2*i); updateTree(A,2*i+1); } } int main(){ int n, m; scanf("%d%d", &n,&m); int treeSize = 2 * pot2(log2(n)); vector<node> R (treeSize), B (treeSize), Y (treeSize); createTree(R,1); createTree(B,1); createTree(Y,1); for(int i=0;i<m;i++){ int l,r,k; scanf("%d%d%d", &l,&r,&k); if(k==1)paintInterval(Y,1,l + treeSize/2 - 1, r + treeSize/2 - 1); else if(k==2)paintInterval(B,1,l + treeSize/2 - 1, r + treeSize/2 - 1); else if(k==3)paintInterval(R,1,l + treeSize/2 - 1, r + treeSize/2 - 1); } updateTree(R,1); updateTree(B,1); updateTree(Y,1); int green = 0; for(int i = treeSize/2;i<treeSize;i++){ if(!R[i].isColored && B[i].isColored && Y[i].isColored)green++; } printf("%d%c",green,'\n'); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <iostream> #include <vector> using namespace std; struct node{ int left; int right; bool isColored; }; int log2(int temp){ int log = 0; bool isok = true; while(temp!= 0){ if(temp%2 == 1 && temp!=1) isok = false; temp = temp/2; log++; } if (isok)log--; return log; } int pot2(int b){ int a=2; if (b==0){ return 1; } else if (b%2 == 0){ int w = pot2(b/2); w = w*w; return w; } else{ int w = pot2(b-1); w = a*w; return w; } } void createTree(vector<node> &A, int i){ A[i].isColored = false; if(i >= A.size()/2){ A[i].left = i; A[i].right = i; } else{ createTree(A,2*i); createTree(A, 2*i +1); A[i].left = A[2*i].left; A[i].right = A[2*i+1].right; } } void paintInterval(vector<node> &A, int i, int targetLeft, int targetRight){ if(A[i].left > targetRight || A[i].right < targetLeft) return; if(targetLeft <= A[i].left && targetRight >= A[i].right){ A[i].isColored = true; return; } int center = (A[i].left + A[i].right)/2; if(targetLeft <= center) paintInterval(A,2*i,targetLeft,targetRight); if(targetRight > center) paintInterval(A,2*i + 1,targetLeft,targetRight); } void updateTree(vector<node> &A, int i){ if(i<A.size()/2){ if(A[i].isColored == 1){ A[2*i].isColored = 1; A[2*i + 1].isColored = 1; } updateTree(A,2*i); updateTree(A,2*i+1); } } int main(){ int n, m; scanf("%d%d", &n,&m); int treeSize = 2 * pot2(log2(n)); vector<node> R (treeSize), B (treeSize), Y (treeSize); createTree(R,1); createTree(B,1); createTree(Y,1); for(int i=0;i<m;i++){ int l,r,k; scanf("%d%d%d", &l,&r,&k); if(k==1)paintInterval(Y,1,l + treeSize/2 - 1, r + treeSize/2 - 1); else if(k==2)paintInterval(B,1,l + treeSize/2 - 1, r + treeSize/2 - 1); else if(k==3)paintInterval(R,1,l + treeSize/2 - 1, r + treeSize/2 - 1); } updateTree(R,1); updateTree(B,1); updateTree(Y,1); int green = 0; for(int i = treeSize/2;i<treeSize;i++){ if(!R[i].isColored && B[i].isColored && Y[i].isColored)green++; } printf("%d%c",green,'\n'); } |