답안 #262436

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
262436 2020-08-12T23:07:06 Z sckmd Examination (JOI19_examination) C++14
100 / 100
1849 ms 6252 KB
#include <bits/stdc++.h>

using namespace std;
#define MAXN 100005
int a[MAXN];
int b[MAXN];
int n;
int sol[MAXN];

struct que
{
  int x,y,z;
  int id;
};

que qq[MAXN];

bool cmp(que a,que b)
{
  return a.x > b.x;
}
bool cmpp(int x,int y)
{
  return a[x] > a[y];
}
bool cmppp(int x,int y)
{
  return b[x] < b[y];
}

vector <int> idsz;
vector <int> ids;
int pozicija[MAXN];
int BLOCK;
vector <int> moalgo[400];
bool active[MAXN];

void add(int idx)
{
  //idx orig niz
  int mopoz = pozicija[idx];
  int bl = mopoz/BLOCK;
  moalgo[bl].push_back(a[idx]+b[idx]);
  sort(moalgo[bl].begin(),moalgo[bl].end());
  active[idx]=true;
}

int query(int y,int z)
{
  int now = 0;
  while(1)
  {
    if(now >= n)break;
    int realid = ids[now];
    if(b[realid] >= y)break;
    now += BLOCK;
  }
  //cout << now << "\n";
  if(now >= n)
  {
  	int ret=0;
  	for(int j = n-1; j >= max(0,(n-1)-BLOCK); j--)
  	{
  		int realid = ids[j];
  		if(!active[realid])continue;
  		if(a[realid]+b[realid] >= z && b[realid]>=y)ret++;
  	}
  	return ret;
  }
  int ret = 0;
  int blo = now/BLOCK;
  if(blo > 0)
  {
    for(int j = max(0,now-BLOCK); j < now; j++)
    {
      int realid = ids[j];
      if(!active[realid])continue;
      if(a[realid]+b[realid]>=z && b[realid] >= y)ret++;
      //cout << j << " " << realid << "\n";
    }
  }
  //cout << "START BL " << blo << "\n";
  for(;now < n;blo += 1,now+=BLOCK)
  {
    auto it = lower_bound(moalgo[blo].begin(),moalgo[blo].end(),z);
    int pos = it-moalgo[blo].begin();
    ret += moalgo[blo].size()-pos;
    //cout << "BL " << blo << "\n";
  }
  return ret;
}

int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int q;
  cin >> n >> q;
  BLOCK = sqrt(n);
  for(int i = 0; i < n; i++)
  {
    cin >> a[i] >> b[i];
    idsz.push_back(i);
    ids.push_back(i);
  }
  for(int i = 0; i < q; i++)
  {
    cin >> qq[i].x >> qq[i].y >> qq[i].z;
    qq[i].id=i;
  }
  sort(qq,qq+q,cmp);
  sort(idsz.begin(),idsz.end(),cmpp);
  sort(ids.begin(),ids.end(),cmppp);
  for(int i = 0; i < ids.size(); i++)pozicija[ids[i]]=i;
  int now = 0;
  for(int i = 0; i < q; i++)
  {
    while(now < n && a[idsz[now]] >= qq[i].x)add(idsz[now]),now++;//,cout << "ADDING " << idsz[now] << "\n";
    //cout << "QUERY " << qq[i].id << "\n";
    sol[qq[i].id]=query(qq[i].y,qq[i].z);
  }
  for(int i = 0; i < q; i++)cout << sol[i] << "\n";
  return 0;
}
/*
5 4
35 100
70 70
45 15
80 40
20 95
20 50 120
10 10 100
60 60 80
0 100 100
*/

Compilation message

examination.cpp: In function 'int main()':
examination.cpp:115:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |   for(int i = 0; i < ids.size(); i++)pozicija[ids[i]]=i;
      |                  ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 7 ms 640 KB Output is correct
8 Correct 7 ms 640 KB Output is correct
9 Correct 7 ms 640 KB Output is correct
10 Correct 8 ms 640 KB Output is correct
11 Correct 5 ms 640 KB Output is correct
12 Correct 6 ms 512 KB Output is correct
13 Correct 6 ms 640 KB Output is correct
14 Correct 6 ms 640 KB Output is correct
15 Correct 6 ms 640 KB Output is correct
16 Correct 5 ms 640 KB Output is correct
17 Correct 6 ms 640 KB Output is correct
18 Correct 3 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1048 ms 6124 KB Output is correct
2 Correct 1046 ms 6120 KB Output is correct
3 Correct 1042 ms 6128 KB Output is correct
4 Correct 964 ms 6120 KB Output is correct
5 Correct 901 ms 5996 KB Output is correct
6 Correct 838 ms 5996 KB Output is correct
7 Correct 1064 ms 5996 KB Output is correct
8 Correct 1222 ms 6164 KB Output is correct
9 Correct 1294 ms 6124 KB Output is correct
10 Correct 704 ms 6024 KB Output is correct
11 Correct 855 ms 6076 KB Output is correct
12 Correct 300 ms 5612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1048 ms 6124 KB Output is correct
2 Correct 1046 ms 6120 KB Output is correct
3 Correct 1042 ms 6128 KB Output is correct
4 Correct 964 ms 6120 KB Output is correct
5 Correct 901 ms 5996 KB Output is correct
6 Correct 838 ms 5996 KB Output is correct
7 Correct 1064 ms 5996 KB Output is correct
8 Correct 1222 ms 6164 KB Output is correct
9 Correct 1294 ms 6124 KB Output is correct
10 Correct 704 ms 6024 KB Output is correct
11 Correct 855 ms 6076 KB Output is correct
12 Correct 300 ms 5612 KB Output is correct
13 Correct 1278 ms 6132 KB Output is correct
14 Correct 1148 ms 6020 KB Output is correct
15 Correct 1037 ms 6120 KB Output is correct
16 Correct 1295 ms 5996 KB Output is correct
17 Correct 883 ms 6128 KB Output is correct
18 Correct 882 ms 6124 KB Output is correct
19 Correct 1225 ms 6252 KB Output is correct
20 Correct 1217 ms 6144 KB Output is correct
21 Correct 1682 ms 6124 KB Output is correct
22 Correct 690 ms 5996 KB Output is correct
23 Correct 848 ms 5996 KB Output is correct
24 Correct 260 ms 5628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 7 ms 640 KB Output is correct
8 Correct 7 ms 640 KB Output is correct
9 Correct 7 ms 640 KB Output is correct
10 Correct 8 ms 640 KB Output is correct
11 Correct 5 ms 640 KB Output is correct
12 Correct 6 ms 512 KB Output is correct
13 Correct 6 ms 640 KB Output is correct
14 Correct 6 ms 640 KB Output is correct
15 Correct 6 ms 640 KB Output is correct
16 Correct 5 ms 640 KB Output is correct
17 Correct 6 ms 640 KB Output is correct
18 Correct 3 ms 512 KB Output is correct
19 Correct 1048 ms 6124 KB Output is correct
20 Correct 1046 ms 6120 KB Output is correct
21 Correct 1042 ms 6128 KB Output is correct
22 Correct 964 ms 6120 KB Output is correct
23 Correct 901 ms 5996 KB Output is correct
24 Correct 838 ms 5996 KB Output is correct
25 Correct 1064 ms 5996 KB Output is correct
26 Correct 1222 ms 6164 KB Output is correct
27 Correct 1294 ms 6124 KB Output is correct
28 Correct 704 ms 6024 KB Output is correct
29 Correct 855 ms 6076 KB Output is correct
30 Correct 300 ms 5612 KB Output is correct
31 Correct 1278 ms 6132 KB Output is correct
32 Correct 1148 ms 6020 KB Output is correct
33 Correct 1037 ms 6120 KB Output is correct
34 Correct 1295 ms 5996 KB Output is correct
35 Correct 883 ms 6128 KB Output is correct
36 Correct 882 ms 6124 KB Output is correct
37 Correct 1225 ms 6252 KB Output is correct
38 Correct 1217 ms 6144 KB Output is correct
39 Correct 1682 ms 6124 KB Output is correct
40 Correct 690 ms 5996 KB Output is correct
41 Correct 848 ms 5996 KB Output is correct
42 Correct 260 ms 5628 KB Output is correct
43 Correct 1238 ms 6080 KB Output is correct
44 Correct 1251 ms 6248 KB Output is correct
45 Correct 1169 ms 6124 KB Output is correct
46 Correct 1342 ms 6252 KB Output is correct
47 Correct 854 ms 6252 KB Output is correct
48 Correct 881 ms 5868 KB Output is correct
49 Correct 1314 ms 6124 KB Output is correct
50 Correct 1547 ms 6252 KB Output is correct
51 Correct 1849 ms 6124 KB Output is correct
52 Correct 687 ms 6056 KB Output is correct
53 Correct 856 ms 6000 KB Output is correct