记录编号 |
390945 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[ZJOI 2013] K大数查询 |
最终得分 |
100 |
用户昵称 |
sssSSSay |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.525 s |
提交时间 |
2017-04-04 18:27:57 |
内存使用 |
43.60 MiB |
显示代码纯文本
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
-
- #define INF 1e9 + 7
-
- using namespace std;
-
- const int Maxn = 510000;
-
- struct node {
- int p,a,b,c,w,ans;
- } q[Maxn], q1[Maxn], q2[Maxn];
-
- int n,m,t1[Maxn],t2[Maxn],temp[Maxn],w[Maxn];
- bool vis[Maxn];
-
- void Add(int x,int c) {
- for(int i = x; i <= n; i += i & (-i)) {
- t1[i] += c;
- t2[i] += c * x;
- }
- }
-
- int read(){
- int x=0; char ch=getchar();
- while (ch<'0' || ch>'9') ch=getchar();
- while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); }
- return x;
- }
-
- bool comp(node a,node b) {return a.w < b.w;}
-
- int Query(int x,int temp = 0) {
- for(int i = x; i; i -= i & (-i))temp += (x + 1) * t1[i] - t2[i];
- return temp;
- }
- int S = 0;
- void Solve(int l,int r,int a,int b) {
- if(a > b) return;
- if(l == r) {
- for(int i = a; i <= b; ++i) {
- if(q[i].p == 2) q[i].ans = l;
- }
- return;
- }
- int mid = (l + r) / 2;
- for(int i = a; i <= b; ++i) {
- if(q[i].p == 1 && q[i].c > mid) {
- Add(q[i].a, 1);
- Add(q[i].b + 1, -1);
- }
- else if(q[i].p == 2){
- temp[i] = Query(q[i].b) - Query(q[i].a - 1);
- }
- }
- for(int i = a; i <= b; ++i) {
- if(q[i].p == 1 && q[i].c > mid) {
- Add(q[i].a, -1);
- Add(q[i].b + 1, 1);
- }
- }
- int l1 = 0,l2 = 0;
- for(int i = a; i <= b; ++i) {
- if(q[i].p == 2) {
- if(temp[i] < q[i].c) {
- q[i].c -= temp[i];
- q1[++l1] = q[i];
- }
- else q2[++l2] = q[i];
- }
- else {
- if(q[i].c <= mid) q1[++l1] = q[i];
- else q2[++l2] = q[i];
- }
- }
- for(int i = a, j = 1; i <= b; ++i, ++j) {
- if(j <= l1) q[i] = q1[j];
- else q[i] = q2[j - l1];
- }
- Solve(l,mid,a,a + l1 - 1);
- Solve(mid + 1,r,a + l1,b);
- }
-
- int main() {
- freopen("zjoi13_sequence.in","r",stdin);
- freopen("zjoi13_sequence.out","w",stdout);
- n = read(); m = read();
- for(int i = 1, p, a, b, c; i <= m; ++i) {
- p = read(); a = read(); b = read(); c = read();
- q[i].p = p; q[i].c = c;
- q[i].a = a; q[i].b = b;
- q[i].w = i;
- }
- Solve(1,n,1,m);
- sort(q + 1,q + 1 + m,comp);
- for(int j = 1; j <= m; ++j) {
- int i = q[j].w;
- if(q[i].p == 2) printf("%d\n",q[i].ans);
- }
- return 0;
- }