题目链接:
http://codeforces.com/gym/101078
A:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
using namespace std;
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
}
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=1e5+5;
const double eps=1e-8;
int a[maxn],p[maxn];
int main()
{
int t;
read(t);
while(t--)
{
int n;
read(n);
For(i,1,n)
{
read(a[i]);
p[a[i]]=i;
}
int st=0,mmax=0,x;
For(i,1,n)
{
read(x);
mmax=max(mmax,p[x]);
if(i==mmax)
{
printf("%d-%d ",st+1,i);
st=i;
}
}
printf("\n");
}
return 0;
}
/*
题意:
给两个[1,n]的排列,现在要给分成几部分,每一部分里面都是数字相同,现在要怎么分;
思路:
水题啦啦;
*/
B:
C:
D:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
using namespace std;
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
}
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=5e3+10;
const double eps=1e-8;
int main()
{
int t;
read(t);
while(t--)
{
LL n;
read(n);
if(n==0){cout<<"0\n";continue;}
LL ans=n-n/2;
for(int i=1;i<=3;i++)
{
if((n+i-1)%3==0)
{
LL t=(n+i-1)/3;
if(t%2==0)t++;
ans=ans+(n-t)/2+1;
break;
}
}
print(ans);
}
return 0;
}
/*
题意:
每个数m和2*m之间都有一根绳,每个奇数m和3*m+1之间有一根绳,现在要把[1,n]拿走,需要剪断多少根绳;
思路:
这个就是个水题,把2*m>n的减去,把3*m+1>n的剪去就是答案了;
*/
E:
F:
G:
H:
I:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
using namespace std;
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
}
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=1e6+5;
const double eps=1e-8;
char s[maxn];
int p,sz;
struct node
{
char ch;
int l,r;
}po[N];
void movele()
{
if(p==0)return ;
p=po[p].l;
}
void moveri()
{
if(po[p].r==0)return ;
p=po[p].r;
}
void insert(char &t)
{
sz++;
po[sz].ch=t;
po[sz].l=p;
po[sz].r=po[p].r;
po[p].r=sz;
if(po[sz].r)po[po[sz].r].l=sz;
p=sz;
}
void dele()
{
if(p==0)return ;
if(po[p].r)
{
int nex=po[p].r;
int pre=po[p].l;
po[nex].l=pre;
po[pre].r=nex;
p=pre;
}
else
{
int pre=po[p].l;
po[pre].r=0;
p=pre;
}
}
void out()
{
p=po[0].r;
while(p)
{
printf("%c",po[p].ch);
p=po[p].r;
}
printf("\n");
}
int main()
{
int t;
read(t);
while(t--)
{
gets(s);
int len=strlen(s);
sz=0;p=sz;
po[0].l=0;po[0].r=0;
for(int i=0;i<len;i++)
{
if(s[i]=='<')movele();
else if(s[i]=='>')moveri();
else if(s[i]=='-')dele();
else insert(s[i]);
}
out();
}
return 0;
}
/*
题意:
模拟几项操作,最后输出密码,其中<表示光标左移一位,>表示右移一位,-表示删除一位,其他的字符就表示插入一个字符,
这些操作都是在可以操作的情况下才执行;
思路:
用一个双向链表模拟一下,我不太会写链表,就用结构体代替啦;
*/
J:
K:
L:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#include <stack>
#include <map>
using namespace std;
#define For(i,j,n) for(int i=j;i<=n;i++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
#define ll long long;
typedef long long LL;
template<class T> void read(T&num) {
char CH; bool F=false;
for(CH=getchar();CH<'0'||CH>'9';F= CH=='-',CH=getchar());
for(num=0;CH>='0'&&CH<='9';num=num*10+CH-'0',CH=getchar());
F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
if(!p) { puts("0"); return; }
while(p) stk[++ tp] = p%10, p/=10;
while(tp) putchar(stk[tp--] + '0');
putchar('\n');
}
const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e18;
const int N=1e6+2000;
const int maxn=5e3+10;
const double eps=1e-8;
char s[maxn];
int main()
{
scanf("%s",s);
int len=strlen(s);
double ans=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='0')
{
for(int j=0;j<=i;j++)
{
if(s[j]=='1')
{
swap(s[i],s[j]);
ans=ans+sqrt(i-j);
break;
}
}
}
}
printf("%.12lf\n",ans);
return 0;
}
/*
题意:
给出一个01串,让把0都换到前边来,每次交换位置i和j的花费为sqrt(i-j);问最小的花费是多少;
思路:
假设现在位置i<j<x<y,i,j为1,x,y为1,sqrt(x-j)+sqrt(y-i)<sqrt(x-i)+sqrt(y-j),
这个大小关系可以通过平方啊比较出来,然后就是最外面的10一块交换花费最小,所以就这样贪心就好;
*/