傳送門
題意:在日本的東海岸和西海岸修交通線,問這些交通線有多少交叉點;
解法:按照x座標公升序,相同的情況下y公升序排序,然後查詢在之前有多少滿足條件的即可
#include #include #include #include #define n 1005#define ll long long
using namespacestd;
typedef structnode
}node;
node a[n*n];
ll d[n];
int get_id(intx)
void update(intx)
}ll sum(intx)
returnans;
}intmain()
sort(a+1,a+k+1);
update(a[1].y);
ll sum=0;
for(int i=2;i<=k;i++)
printf("test case %d: ",++case);
printf("%lld\n",sum);
}return 0;
}
傳送門題意:給你一顆蘋果樹,每個節點初始都有乙個蘋果,執行一些操作(有蘋果的直接拿掉 沒有的直接補上去乙個蘋果),然後查詢這個節點的子樹上有多少個蘋果;
解法:第一反應樹剖+樹狀陣列查詢區間和(似乎有更簡單的樹狀陣列 並不會2333333)
#include #include #include #include #include #include #define n 100005using namespacestd;
int pos;int son[n];int deep[n];inta[n];
int first[n*2];int next[n*2];int vi[n*2];
voidintx()
int fa[n];intnum[n];
void dfs1(int v,intpre)}}
}int p[n];int tp[n];intfp[n];
void dfs2(int v,inttd)
}intd[n];
int get_id(intx)
intn;
void get_d(intn)
}}void update(int x,intt)
}int sum(intx)
returnans;
}intmain()
dfs1(1,0);
dfs2(1,1);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++) a[i]=1;
memset(d,0,sizeof(d));
get_d(n);
int q;scanf("%d",&q);char s[5];
for(int i=1;i<=q;i++)
else if(s[0]=='c')
else}}
// for(int i=1;i<=n;i++) vec[i].clear();
} return 0;
}
傳送門題意:求乙個區間是多少個區間真子區間(只允許乙個端點相同)
解法:按照x公升序排序後,x相同時按照y的降序排序;然後查詢即可(可能存在完全相等的兩個區間;要注意這個下標從0開始)
#include #include #include #include #include #include #define n 100005using namespacestd;
typedef structnode
}node;
node a[n];
int d[n];intvis[n];
int get_id(intx)
void update(intx)
}void sum(int x,intbiao)
vis[biao]=ans;
}intmain()
int u=0;
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
else
}u++;
update(a[i].y);
}for(int i=1;i<=n;i++)
printf("\n");
}return 0;
}
傳送門題意:給你每個星星的位置,求這個星星的座標範圍內有多少個星星(包括自己)
題解:按照x公升序x相同時公升序,查詢統計即可;
#include #include #include #include #define n 32005#define m 15005
using namespacestd;
typedef structnode
}node;
intn;
node a[m];
int d[n];intvis[n];
int get_id(intx)
void update(intx)
}void sum(intx)
vis[ans]++;
}intmain()
memset(vis,0,sizeof(vis));
memset(d,0,sizeof(d));
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
}return 0;
}
最後一題:
傳送門題意:給乙個正方形,初始都是0,1操作是乙個點的修改,2查詢左下角和右上角形成的矩陣的和
題解:一維樹狀陣列拓展為二維樹狀陣列 在x y方向彼此獨立
#include #include#include
#include
#define ll long long
using
namespace
std;
ll d[
1030][1030
];int get_id(int
x)void update(int x,int y,int
vulue)
}}int sum(int x,int
y) }
return
ans;
}int
main()
else
if(t==2
) }
}return0;
}
樹狀陣列(總結篇)
by zyq 2014 7 樹狀陣列何其牛逼只能這麼形容啊。首先,網上好多對樹狀陣列基礎知識講解的在這就不細講了。可以參考 內容比較老了 下面總結一下樹狀陣列的題型 1.最簡單的單點更新區間查詢 其實這個是樹狀陣列的精髓了,不過入門的時候都會做些簡單題找感覺吧。下面附上簡單題找感覺,動腦子的題後面貼...
樹狀陣列總結
樹狀陣列的基本知識已經被各種大牛和菜鳥講到爛了,我就不多說了,下面給出基本操作的 假定原陣列為a 1.n 樹狀陣列b 1.n 考慮靈活性的需要,使用int a傳陣列。define lowbit x x x int sum int a,int x void update int a,int x,int...
樹狀陣列總結
樹狀陣列是對乙個陣列改變某個元素和求和比較實用的資料結構。兩中操作都是o logn 在解題過程中,我們有時需要維護乙個陣列的字首和s i a 1 a 2 a i 但是不難發現,如果我們修改了任意乙個a i s i s i 1 s n 都會發生變化。可以說,每次修改a i 後,調整字首和s在最壞情況下...