건설 ...... G가 구덩이를 작성하는, AB는 ^ _ ^ 추정치가하지 않습니다 보지 못했다.
G 외에도이 조금 어렵거나 div3해서는 안 보인다에서 어떻게 든 그것은 보인다 ......
BerSU에서 C. 시험
문제의 의미
당신에게 길이 줄 \을 (N- \) 시퀀스 \ (A_I \) . 각 \ (I [1에 \ N] \) 추구 \가 ([1, I-1 ] \) , 적어도이 얼마나 생략 남은 만족 \ ([1, I] \ ) 번호 이하 \ (M \) .
\ (n \ 2 \ cdot 10 ^ 5 M \ 2 \ cdot 10 ^ 7 A_I \ 100 \) .
해결책
범위 참조 \을 (\ 르 100 \) , 버킷 각 숫자는, 다음을 완료 폭력 배럴을 내림차순으로 다시 스캔 횟수를 기억 직접 나타납니다. . .
암호
#include<bits/stdc++.h>
using namespace std;
priority_queue<int> q;
const int N=2e5+5;
int a[N],t[233],n,m,sum;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i)
{
sum+=a[i];
if(sum<=m)
{
++t[a[i]];
printf("0 ");
continue;
}
int ans=0,tmp=sum;
for(int j=100;j&&tmp>m;--j)
{
if(tmp-t[j]*j<=m)
{
printf("%d ",ans+(tmp-m-1)/j+1);
break;
}
else tmp-=t[j]*j,ans+=t[j];
}
++t[a[i]];
}
}
D. 추가 요소
문제의 의미
길이로 \ N- (\) 의 숫자는 삭제하여, 열 번호 산술 시퀀스의 원래의 재배 열의 개수.
해결책
A는 라인에 직접 삭제에서 차이가 범위의 경우 ...... 내가 무슨 말을 해야할지하지 않습니다. 처음 세 개의 특별한 숫자가 선고 될 수 있습니다.
암호
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2e5+5;
int a[N],id[N];
bool cmp(int x, int y) {
return a[x]<a[y];
}
int main()
{
int n; scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),id[i]=i;
sort(id+1,id+1+n,cmp);
sort(a+1,a+1+n);
if(n<=3)
{
puts("1");
return 0;
}
int del=0,cha;
if(a[3]-a[2]!=a[2]-a[1])
{
if(a[3]-a[2]==a[4]-a[3])
{
del=1;
cha=a[3]-a[2];
}
else if(a[3]-a[1]==a[4]-a[3])
{
del=2;
cha=a[3]-a[1];
}
else if(a[2]-a[1]==a[4]-a[2])
{
del=3;
cha=a[2]-a[1];
}
else
{
puts("-1");
return 0;
}
}
else cha=a[2]-a[1];
for(int i=del?4:3;i<=n;++i)
{
int l=(del==i-1?i-2:i-1);
if(a[i]-a[l]!=cha)
{
if(del)
{
puts("-1");
return 0;
}
del=i;
}
}
printf("%d",!del?id[1]:id[del]);
}
E. 폴리 카르 뱀
문제의 의미
...... 중복 복잡한 주제, 또는 직접 보려면 원래 제목 얼굴 을 ......
해결책
난 당신이 시뮬레이션을 직접 할 수있는 질문의 의미에 따라, 무슨 말을 해야할지하지 않습니다. 세부 사항의 일부를합니다.
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2005;
char s[N][N];
int x1[N],x2[N],y1[N],y2[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,mx=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%s",s[i]+1);
bool flag=true;
for(int a=0;flag&&a<26;++a)
{
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
{
if(s[i][j]!=a+'a') continue;
if(!x1[a]&&!y1[a]) x1[a]=x2[a]=i,y1[a]=y2[a]=j;
else
{
x1[a]=min(x1[a],i),x2[a]=max(x2[a],i);
y1[a]=min(y1[a],j),y2[a]=max(y2[a],j);
}
}
if(x1[a]!=x2[a]&&y1[a]!=y2[a])
{
flag=false;
break;
}
if(x1[a]) mx=a+1;
else continue;
if(x1[a]==x2[a])
{
for(int j=y1[a];j<=y2[a];++j)
{
if(s[x1[a]][j]<a+'a') {
flag=false;
continue;
}
}
}
else
{
for(int j=x1[a];j<=x2[a];++j)
{
if(s[j][y1[a]]<a+'a') {
flag=false;
continue;
}
}
}
}
if(!flag)
{
puts("NO");
for(int i=0;i<26;++i) x1[i]=y1[i]=x2[i]=y2[i]=0;
continue;
}
printf("YES\n%d\n",mx);
for(int a=0;a<mx;++a)
{
if(!x1[a])
{
bool f=true;
for(int i=1;f&&i<=n;++i)
for(int j=1;f&&j<=m;++j)
{
if(s[i][j]>a+'a')
{
printf("%d %d %d %d\n",i,j,i,j);
f=false;
}
}
continue;
}
printf("%d %d %d %d\n",x1[a],y1[a],x2[a],y2[a]);
x1[a]=y1[a]=x2[a]=y2[a]=0;
}
}
}
F. 두 피자
문제의 의미
이 \ (n \) 개인, 모두가 어떤 마음에 드는 재료를 가지고, 거기에 \ (m의 \) 피자, 각 피자는 가격과 성분을 가지고 있습니다. 가격에서 가능한 한 적은 지금 최대한 전제로 사람들을 만족 시키도록하면, 두 개의 피자를 사고 싶은데요. 자신의 좋아하는 모든 재료는이 피자에 출연 경우 만 사람을 만족시킬 수 있습니다.
여러 가지 재료를 초과하지 않는 \ (9 \)를 . \ (N-, m \ 르 2 \ ^. 5 CDOT 10 \) .
해결책
물론, 몇 가지 피자의 종류 이하의 사람들 \ (2 ^ 9 \)는 , 배럴의 직접 사용은 무엇을 기억 각 사람이 어떻게 각각의 피자 최소 / 초 최소 가격과 수 많은. 그런 다음 \ ((2 ^ 9) ^ 3 \) 피자 열거하고 두 사람이 될 수 있습니다. 세부 사항의 일부를합니다.
암호
#include<cstdio>
#include<cstring>
const int N=515;
int a[N],b[N],id[N],b2[N],xid[N],id1,id2,ans,cost;
inline int gi()
{
char c=getchar(); int x=0;
for(;c<'0'||c>'9';c=getchar());
for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+c-'0';
return x;
}
int main()
{
int n=gi(),m=gi();
for(int i=1;i<=n;++i)
{
int x=gi(),s=0;
while(x--) s|=(1<<gi()-1);
++a[s];
}
memset(b,0x3f,sizeof(b));
memset(b2,0x3f,sizeof(b2));
for(int i=1;i<=m;++i)
{
int c=gi(),x=gi(),s=0;
while(x--) s|=(1<<gi()-1);
if(c<b[s]) b[s]=c,id[s]=i;
else if(c<b2[s]) b2[s]=c,xid[s]=i;
}
cost=2e9+5;
for(int s1=0;s1<512;++s1)
for(int s2=0;s2<512;++s2)
{
if(!id[s1]||!id[s2]) continue;
int tid1,tid2,tcost;
if(s1==s2) tid1=id[s1],tid2=xid[s1],tcost=b[s1]+b2[s1];
else tid1=id[s1],tid2=id[s2],tcost=b[s1]+b[s2];
int ret=0;
for(int s3=0;s3<512;++s3)
if(((s1|s2)&s3)==s3) ret+=a[s3];
if(ret>ans||(ret==ans&&cost>tcost)) cost=tcost,ans=ret,id1=tid1,id2=tid2;
}
printf("%d %d",id1,id2);
}