A Alien Sunset
暴力枚举t
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
int h,r,t;
}info[205];
int n;
bool suit(int i,int t){
int tt=t%info[i].h;
if(info[i].r<=info[i].t) return tt>=info[i].t||tt<=info[i].r;
return tt>=info[i].t&&tt<=info[i].r;
};
bool check(int t){
for(int i=1;i<=n;i++){
if(!suit(i,t)) return 0;
}
return 1;
}
int main(){
//freopen("in.txt","r",stdin);
scanf("%d",&n);
int mx=2;
for(int i=1;i<=n;i++){
scanf("%d%d%d",&info[i].h,&info[i].r,&info[i].t);
mx=max(mx,info[i].h);
}
int ans = -1;
for(int t=0;t<1825*mx;t++)
if(check(t)){
ans=t;break;
}
if(ans==-1) puts("impossible");
else printf("%d
",ans);
return 0;
}
B Breaking Biscuits
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-8;
int sgn(double x){
if(x>eps) return 1;
if(x<-eps) return -1;
return 0;
}
struct point{
double x,y;
point(){}
point(double _x,double _y):x(_x),y(_y){}
void in(){
scanf("%lf%lf",&x,&y);
}
}v[1005];
struct L{
point p,v;
L(){}
L(point _p,point _v):p(_p),v(_v){}
double len(){
double x=p.x-v.x;
double y=p.y-v.y;
return sqrt(x*x+y*y);
}
}T;
double dist(point a,L T){
double x1=T.p.x-a.x;
double y1=T.p.y-a.y;
double x2=T.v.x-a.x;
double y2=T.v.y-a.y;
double area=x1*y2-x2*y1;
double len=T.len();
return area/len;
}
int main(){
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
v[i].in();
double res = 1e30;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++){
T=L(v[i],v[j]);
double l=1e50,r=-1e50;
for(int k=1;k<=n;k++){
double dis=dist(v[k],T);
l=min(l,dis);
r=max(r,dis);
}
res=min(res,r-l);
}
printf("%.8lf
",res);
return 0;
}
C
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,int> mp;
string st;
int num[10];
int main(){
//freopen("in.txt","r",stdin);
mp["red"]=1;mp["yellow"]=2;mp["green"]=3;
mp["brown"]=4;mp["blue"]=5;mp["pink"]=6;
mp["black"]=7;
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>st;
num[mp[st]]++;
}
int mxid=0;
for(int i=7;i>=1;i--){
if(num[i]){
mxid=i;
break;
}
}
int rednum=num[1];
if(rednum==0){
int ans=0;
for(int i=1;i<=7;i++) ans+=num[i]*i;
printf("%d
",ans);
}
else{
int ans=0;
if(mxid==1) ans=1;
else{
ans+=(mxid+1)*num[1];
for(int i=2;i<=7;i++) ans+=i*num[i];
}
printf("%d
",ans);
}
return 0;
}
D
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1050];
int id[1050];
int to[1050];
int main() {
//freopen("in.txt","r",stdin);
scanf("%s", s + 1);
int n = strlen(s + 1);
for (int i = 1; i <= n; i++) id[i] = i;
for (int i = 1; i < n; i++) {
for (int j = 1; j < n; j++) {
if (s[j] > s[j + 1]) {
swap(s[j], s[j + 1]);
swap(id[j], id[j + 1]);
}
}
}
vector<pair<int, int> > res;
for (int i = 1; i <= n; i++)
to[id[i]] = i;
while (1) {
bool flg = 1;
for (int i = 1; i <= n; ++i) {
if (id[i] != i) {
flg = 0;
res.push_back(make_pair(i, id[i]));
int t = id[i];
int tt = to[i];
id[tt] = id[i];
to[t] = tt;
id[i] = i;
}
}
if (flg) break;
}
for (int i = (int)res.size() - 1; i >= 0; i--) {
printf("%d %d
", res[i].second, res[i].first);
}
return 0;
}
E
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5000 + 100;
int w[maxn], c[maxn];
struct node {
int x, id;
} a[maxn];
int vis[maxn], res[maxn];
int n, m;
bool cmp(node A,node B){
return A.x<B.x;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i].x), a[i].id = i;
for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
for (int i = 1; i <= m; i++) scanf("%d", &w[i]);
sort(a + 1, a + 1 + n, cmp);
int flag = 1;
for (int i = n; i >= 1; i--) {
int mm = 10000000;
int id = -1;
for (int j = 1; j <= m; j++) {
if (c[j] >= a[i].x && vis[j] == 0) {
if (mm > w[j]) {
mm = w[j], id = j;
}
}
}
if (id == -1) {
flag = 0; break;
}
res[a[i].id] = id;
vis[id] = 1;
}
if (flag == 0) printf("impossible
");
else {
for (int i = 1; i <= n; i++) {
if (i != 1) printf(" ");
printf("%d", res[i]);
}
printf("
");
}
return 0;
}
F
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 405;
double f[maxn][maxn];
int n,k;
int main(){
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)f[0][i]=i;
for(int i=1;i<=k;i++){
f[i][0]=max(f[i][0],(f[i-1][0]+f[i-1][1])/2);
for(int j=1;j<=n;j++){
f[i][j]=(f[i-1][j]+f[i-1][j-1])/2;
if(j<n)f[i][j]=max(f[i][j],(f[i-1][j]+f[i-1][j+1])/2);
}
}
printf("%.8lf
",f[k][0]);
return 0;
}
G
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
int x,y,z;
bool operator == (const node &a) const{
return x==a.x&&y==a.y&&z==a.z;
}
void in(){
scanf("%d%d%d",&x,&y,&z);
}
}n1,n2,p1,p2,tmp;
int link(node A,node B){
if(A.x==B.x&&A.y==B.y&&A.z==B.z+1)
return 6;
if(A.x==B.x&&A.y==B.y&&A.z==B.z-1)
return 5;
if(A.x==B.x&&A.y==B.y+1&&A.z==B.z)
return 4;
if(A.x==B.x&&A.y==B.y-1&&A.z==B.z)
return 3;
if(A.x==B.x+1&&A.y==B.y&&A.z==B.z)
return 2;
if(A.x==B.x-1&&A.y==B.y&&A.z==B.z)
return 1;
return 0;
}
int main(){
//freopen("in.txt","r",stdin);
n1.in();p1.in();
n2.in();p2.in();
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
int flg=0;
while(1){
if(n1==p1&&n2==p2) break;
//n1
int opt=link(n1,n2);
if(opt&&flg==0){
if(opt==6){
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.z--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.z--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
if(opt==5){
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.z++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.z++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
if(opt==4){
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
if(opt==3){
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
if(opt==2){
n1.y--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
if(opt==1){
n1.y--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.x++;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
n1.y--;
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
flg=1;
} else {
tmp=n1;
if(n1.x!=p1.x){
if(n1.x<p1.x) n1.x++;
else n1.x--;
} else {
if(n1.y!=p1.y){
if(n1.y<p1.y) n1.y++;
else n1.y--;
} else {
if(n1.z!=p1.z){
//puts("SDASD");
if(n1.z<p1.z) n1.z++;
else n1.z--;
}
}
}
//n2
if(n2.z!=p2.z){
if(n2.z<p2.z) n2.z++;
else n2.z--;
} else {
if(n2.y!=p2.y){
if(n2.y<p2.y) n2.y++;
else n2.y--;
} else {
if(n2.x!=p2.x){
if(n2.x<p2.x) n2.x++;
else n2.x--;
}
}
}
if(n1==n2){
n1=tmp;
}
}
printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
}
return 0;
}
H
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50000+5;
int B,P;
int d[maxn];
int a[maxn],p[maxn];
int f,r,tail,n;
int Q[maxn<<8];
int res[maxn<<8];
bool check(int x){
if(p[x]>=P) return 0;
if(x>1){
if(abs(d[p[x]+1]-d[p[x-1]])>B ||
abs(d[p[x]+1]-d[p[x-1]])<a[x]||
abs(d[p[x]+1]-d[p[x-1]])<a[x-1]) return 0;
}
if(x<tail){
if(abs(d[p[x]+1]-d[p[x+1]])>B ||
abs(d[p[x]+1]-d[p[x+1]])<a[x]||
abs(d[p[x]+1]-d[p[x+1]])<a[x+1]) return 0;
}
return 1;
}
int main(){
scanf("%d",&B);
scanf("%d",&P);
for(int i=1;i<=P;i++)
scanf("%d",d+i);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",a+i,p+i);
}
f=1,r=0;
for(int i=1;i<=n;i++){
if(p[i]>=P) break;
tail=i;
Q[++r]=i;
}
int top = 0;
while(f<=r){
int x=Q[f++];
if(check(x)){
p[x]++;
res[top++]=x;
while(tail&&p[tail]>=P) tail--;
if(x>1) Q[++r]=x-1;
if(x<tail) Q[++r]=x+1;
if(x<=tail) Q[++r]=x;
}
}
bool ok=1;
for(int i=1;i<=n;i++)
if(p[i]<P) ok=0;
if(!ok) puts("impossible");
else
for(int i=0;i<top;i++)
printf("%d%c",res[i],"
"[i==top-1]);
return 0;
}
I
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int a[maxn];
int main(){
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int Mn=INT_MAX,ans;
int T;
scanf("%d",&T);
for(int i=1;i<=n;i++){
if(T%a[i]<Mn){
Mn=T%a[i];
ans=a[i];
}
}
cout<<ans;
return 0;
}
J
#include <bits/stdc++.h>
using namespace std;
const int maxn=2000+10;
int n,a[maxn];
long double ans;
int main() {
scanf("%d",&n);
int tmp;
for(int i=1;i<=n;i++) {
scanf("%d",&tmp);
if(tmp==0) ans+=2.0;
else if(tmp==1) ans+=1.0;
else if(tmp==2) ans+=(1.0/2);
else if(tmp==4) ans+=(1.0/4);
else if(tmp==8) ans+=(1.0/8);
else if(tmp==16) ans+=(1.0/16);
}
printf("%.8Lf",ans);
return 0;
}
K
#include<bits/stdc++.h>
#define maxn 1050
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int b[maxn];
struct node{
int x,y;
}a[maxn];
struct Edge{
int from,to,cap,flow;
};
struct Dinic{
int n,m,s,t;
vector<Edge>edges;
vector<int>G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn];
void ClearAll(int n){
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void AddEdge(int from,int to,int cap){
edges.push_back((Edge){from,to,cap,0});
edges.push_back((Edge){to,from,0,0});
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
bool BFS(){
memset(vis,0,sizeof(vis));
queue<int>Q;
Q.push(s);
vis[s]=1;
d[s]=0;
while(!Q.empty()){
int x=Q.front();
Q.pop();
for(int i=0;i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(!vis[e.to] && e.cap>e.flow){
vis[e.to]=1;
d[e.to]=d[x]+1;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x,int a){
if(x==t || a==0) return a;
int flow=0,f;
for(int i=cur[x];i<G[x].size();i++){
Edge& e=edges[G[x][i]];
if(d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){
e.flow+=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
}
int Maxflow(int s,int t){
this->s=s; this->t=t;
int flow=0;
while(BFS()){
memset(cur,0,sizeof(cur));
flow+=DFS(s,inf);
}
return flow;
}
}g;
vector<int>ans[maxn];
void dfs(int len,int x){
if(x==0) return;
x-=n;
ans[len].push_back(x);
for(int i=0;i<g.G[x].size();i++){
if(g.edges[g.G[x][i]].flow<0){
dfs(len,g.edges[g.G[x][i]].to);
break;
}
}
}
int main(){
// freopen("input.txt","r",stdin);
int S=0,T=500,T2=1000;
g.ClearAll(maxn);
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[j].y>=b[i]) g.AddEdge(j+n,T+i,1);
}
}
for(int i=1;i<=m;i++) g.AddEdge(T+i,T2,1);
for(int i=1;i<=n;i++){
if(a[i].x==0) g.AddEdge(S,i,1);
g.AddEdge(i,i+n,1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
if(a[i].y>=a[j].x) g.AddEdge(i+n,j,1);
}
}
int re=g.Maxflow(S,T2);
if(re!=m) puts("impossible");
else{
for(int i=1;i<=m;i++){
for(int j=0;j<g.G[T+i].size();j++){
if(g.edges[g.G[T+i][j]].flow<0){
dfs(i,g.edges[g.G[T+i][j]].to);
}
}
}
for(int i=1;i<=m;i++){
for(int j=ans[i].size()-1;j>=0;j--){
if(j==0) printf("%d
",ans[i][j]);
else printf("%d ",ans[i][j]);
}
}
}
return 0;
}
L
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
struct node{
int x,y,h;
ll d;
void in(){
scanf("%d%d",&x,&y);
}
}v[maxn],O;
int n;
int S[maxn];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
bool cmp(node A,node B){
if(A.x==B.x){
if(A.y==B.y){
return A.d<B.d;
}
return A.y<B.y;
}
return A.x<B.x;
}
int main(){
//freopen("in.txt","r",stdin);
O.in();
scanf("%d",&n);
for(int i=1;i<=n;i++){
v[i].in();scanf("%d",&v[i].h);
v[i].x-=O.x;v[i].y-=O.y;
v[i].d=(ll)((ll)v[i].x*v[i].x+(ll)v[i].y*v[i].y);
int G=gcd(abs(v[i].x),abs(v[i].y));
v[i].x/=G;v[i].y/=G;
}
sort(v+1,v+1+n,cmp);
int lst;
int res = 0;
for(int i=1;i<=n;i=lst+1){
lst=i;
while(lst<n&&v[lst+1].x==v[lst].x&&v[lst+1].y==v[lst].y) lst++;
int top=0;
for(int j=i;j<=lst;j++){
if(top==0||v[j].h>S[top]){
S[++top]=v[j].h;
} else {
int l=1,r=top,id;
while(l<=r){
int mid=(l+r)/2;
if(S[mid]>=v[j].h){
r=mid-1;
id=mid;
} else {
l=mid+1;
}
}
S[id]=v[j].h;
}
}
res += top;
}
cout<<res<<endl;
return 0;
}