# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
28948 |
2017-07-18T01:52:45 Z |
시제연(#1229) |
Take-out (POI13_usu) |
C++11 |
|
113 ms |
65536 KB |
#include <bits/stdc++.h>
using namespace std;
int n, k, p;
char str[1000100];
int csum[1000100];
vector<int> cloc;
vector<int> res[1000100];
int getc(int s, int e) {
return csum[e]-csum[s-1];
}
int bs1(int a, int b) {
int s = 1, e = (b-a+1)/(k+1)-1;
while(s<=e) {
int m = (s+e)>>1;
if (getc(a,a+(k+1)*m-1)==m) return a+(k+1)*m-1;
else if (getc(a,a+(k+1)*m-1)>m) s = m+1;
else e = m-1;
}
return a+(k-1)*s-1;
}
int bs2(int a, int b) {
int s = a, e = b;
while(s<=e) {
int m = (s+e)>>1;
if (getc(a,m)>=(m-a)/(k+1)+1) e = m-1;
else s = m+1;
}
return s;
}
void dnc(int s, int e) {
int i;
if (s+k==e) {
for (i=s;i<=e;i++) res[p].push_back(i);
p++;
return;
}
bool f1 = (getc(s,s+k)>0), f2 = (getc(e-k,e)>0);
if (f1&&f2) {
int idx = bs1(s,e);
dnc(s,idx); dnc(idx+1,e);
}
else if (f1&&!f2) {
int idx = (*lower_bound(cloc.begin(),cloc.end(),s));
for (i=s;i<=idx;i++) res[p].push_back(i);
for (i=e-k+idx-s+1;i<=e;i++) res[p].push_back(i);
p++;
dnc(idx+1,e-k+idx-s);
}
else if (!f1&&f2) {
int idx = (*(--upper_bound(cloc.begin(),cloc.end(),e)));
for (i=s;i<=s-e+k+idx-1;i++) res[p].push_back(i);
for (i=idx;i<=e;i++) res[p].push_back(i);
p++;
dnc(s-e+k+idx,idx-1);
}
else {
int idx = bs2(s,e);
int r = (idx-s)%(k+1);
for (i=s;i<s+r;i++) res[p].push_back(i);
res[p].push_back(idx);
for (i=e-k+r+1;i<=e;i++) res[p].push_back(i);
p++;
dnc(s+r,idx-1); dnc(idx+1,e-k+r);
}
}
int main() {
int i, j;
scanf("%d%d",&n,&k);
scanf("%s",str+1);
for (i=1;i<=n;i++) {
csum[i] = csum[i-1]+(str[i]=='c');
if (str[i]=='c') cloc.push_back(i);
}
dnc(1,n);
for (i=0;i<p;i++) {
for (j=0;j<res[i].size();j++) printf("%d ",res[i][j]);
printf("\n");
}
return 0;
}
Compilation message
usu.cpp: In function 'int main()':
usu.cpp:84:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (j=0;j<res[i].size();j++) printf("%d ",res[i][j]);
^
usu.cpp:76:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&n,&k);
^
usu.cpp:77:19: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%s",str+1);
^
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
30344 KB |
Output is correct |
2 |
Correct |
0 ms |
30344 KB |
Output is correct |
3 |
Correct |
9 ms |
30344 KB |
Output is correct |
4 |
Correct |
9 ms |
30344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
30344 KB |
Output is correct |
2 |
Correct |
9 ms |
30344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
30344 KB |
Output is correct |
2 |
Correct |
6 ms |
30344 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
6 ms |
30344 KB |
Output is correct |
2 |
Correct |
9 ms |
30476 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
36 ms |
31972 KB |
Output is correct |
2 |
Correct |
19 ms |
31196 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
39 ms |
32308 KB |
Output is correct |
2 |
Correct |
39 ms |
31828 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
59 ms |
33020 KB |
Output is correct |
2 |
Correct |
43 ms |
31740 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
113 ms |
34704 KB |
Output is correct |
2 |
Correct |
109 ms |
35060 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Memory limit exceeded |
76 ms |
65536 KB |
Memory limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |