Codeforces Round#656(Div.3)A,B,C,D,E(その他の補完対象)
46019 ワード
簡単な問題ですが、長い間考えていたので、泣きました.条件を満たすx,y,zには絶対に2つの数が等しいし、もう1つの数よりも大きいので、私もなぜか説明しにくいので、、、、ちょっと我慢して、自分でサンプルを見て考えてみましょう.答えに向かってプログラミングするのは難しいです.私はあまり題意を書きたくありません.もともと理解しやすい英語の問題で、試合に出るのはすべて英語の問題なので、みんなは英語を読むのに慣れなければなりません.
void sove()
{
int a[4];
scanf("%d%d%d",&a[1],&a[2],&a[3]);
sort(a+1,a+1+3);
if(a[3]==a[2]&&a[3]>=a[1])
{
printf("YES
");
printf("%d %d %d
",a[1],a[1],a[3]);
}
else
{
printf("NO
");
}
}
2.B. Restore the Permutation by Mergerこれこそ問題にサインするべき姿で、問題の意味は言わないで、よく理解する方法は左から右まで記数をマークして、もし現れなかったら出力して、しかもマークして、現れたら直接スキップします
void sove()
{
int n;
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
{
scanf("%d",&a[i]);
}
ms(vis,0);
for(int i=1;i<=2*n;i++)
{
if(!vis[a[i]])
{
printf("%d ",a[i]);
vis[a[i]]=1;
}
}
printf("
");
}
3.C. Make It Good cの問題は他の人はすべて模擬したことがあって、私は特に2点を使ってやっと過ぎて、怒って、この問題はきっと2点を満たして、削除するのが多ければ多いほど、そんなに正しいかもしれないので、削除するのが少なければ少ないほど正しいことはできません.
bool check(int x)
{
int l=x+1,r=n,ma=0;
bool flage=true;
while(r>=l)
{
if(a[l]>=a[r]&&ma<=a[r])
{
ma=a[r];
r--;
}
else if(a[l]<a[r]&&a[l]>=ma)
{
ma=a[l];
l++;
}
else
{
flage=false;
break;
}
}
return flage;
}
void sove()
{
//int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int l=0,r=n-1,ans;
while(r>=l)
{
int mid=(l+r)>>1;
if(check(mid))
{
r=mid-1;
ans=mid;
}
else
{
l=mid+1;
}
}
printf("%d
",ans);
}
4.D. a-Good Stringこの問題は暴力bfsで済むので、何も言うことはありません.コードに何か書けばわかるはずです.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
char s[maxn],dp[30];
int dfs(int l,int r,char ch)
{
//if(dp[num])return dp[num];
if(l==r) l==r
{
return ch==s[l]?0:1;
}
int cnt1=0,ans=0,cnt2=0;
for(int i=l;i<=(l+r)/2;i++)
{
if(ch!=s[i])// ch , cnt1++,cnt1
{
cnt1++;
}
}
for(int i=(l+r)/2+1;i<=r;i++)
{
if(ch!=s[i])// ch ,
{
cnt2++;
}
}
return min(dfs(l,(l+r)/2,ch+1)+cnt2,dfs((l+r)/2+1,r,ch+1)+cnt1);// cnt1 cnt2 ch+1, ch='b', ch+1='c'
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
ms(dp,0);
cin>>n>>s+1;
printf("%d
",dfs(1,n,'a'));
}
return 0;
}
E.Directing Edges昨日の试合を终えてやっとトポロジーの顺位を见て、今日他の人の题解を见てトポロジーの顺位を使って、本当にこのように巧みですか???
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
#define lowbit(x) x & -x
#define fi first
#define se second
#define bug cout<
#define IOS ios::sync_with_stdio(false), cin.tie(0),cout.tie(0)
using namespace std;
const int maxn = 2e5 + 50;
const int maxm = 1.5e5+50;
const double eps = 1e-7;
const int inf = 0x3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e8;
const double pi=3.141592653589;
vector<int>ve[maxn];
int in[maxn],n,pxun[maxn];
bool toop_sort()//
{
queue<int>q;
for(int i=1;i<=n;i++)
{
if(!in[i])
{
q.push(i);
}
}
int ans=0;
while(!q.empty())
{
int u=q.front();
q.pop();
pxun[u]=ans++;//
for(int i=0;i<ve[u].size();i++)
{
int v=ve[u][i];
in[v]--;
if(!in[v])
{
q.push(v);
}
}
}
return ans==n;
}
int vis[maxn],din[maxn],dout[maxn];
void sove()
{
int m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
ve[i].clear();
in[i]=0;
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&vis[i],&din[i],&dout[i]);
if(vis[i])
{
ve[din[i]].push_back(dout[i]);
in[dout[i]]++;
}
}
if(toop_sort())
{
printf("YES
");
}
else
{
printf("NO
");
return;
}
for(int i=1;i<=m;i++)
{
if(vis[i]||pxun[din[i]]<pxun[dout[i]])// ;
{
printf("%d %d
",din[i],dout[i]);
}
else
{
printf("%d %d
",dout[i],din[i]);
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
sove();
}
return 0;
}