2019icpc西安邀请赛

Posted wrjlinkkkkkk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019icpc西安邀请赛相关的知识,希望对你有一定的参考价值。

来源:jisuanke

更新中

A.Tasks

直接贪心

代码:

技术图片
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
     
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x))
 
using namespace std;
 
typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
 
const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 1e6+100;
const int maxm = 6e6+100;
//const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f;
const int MAXN = maxn;
const int MAXM = maxm;
const db pi = acos(-1.0);

int n, t;
int a[maxn];
int main() 
    scanf("%d %d" ,&n ,&t);
    for(int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    
    sort(a,a+n);
    int tmp = 0;
    int ans = 0;
    for(int i = 0; i < n; i++)
        if(tmp+a[i]<=t)
            tmp+=a[i];ans++;
        

    printf("%d", ans);
    return 0;
View Code

C.Angel‘s Journey

题意:给定一个圆的圆心(rx, ry),半径r,A的坐标(rx, ry-r),B的坐标(x, y),y>ry,只能走圆上以及圆外y>ry的地方,求A到B的最短路

思路:当x<rx-r或x>rx+r的时候直接从半圆的地方走直线,否则在圆弧上走到切点然后走直线

代码:

技术图片
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
     
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x))
 
using namespace std;
 
typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
 
const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 1e6+100;
const int maxm = 6e6+100;
//const int inf = 0x3f3f3f3f;
const int INF = 0x3f3f3f3f;
const int MAXN = maxn;
const int MAXM = maxm;
const db pi = acos(-1.0);

int n, t;
int a[maxn];
int main() 
    double rx,ry,r,x,y;
    int t;
    scanf("%d" ,&t);
    while(t--)
        scanf("%lf %lf %lf %lf %lf", &rx,&ry,&r,&x,&y);

        double ob = sqrt((x-rx)*(x-rx)+(y-ry)*(y-ry));
        double ans = sqrt(ob*ob-r*r)+r*(pi/2.0+asin((y-ry)/ob)-acos(r/ob));
        if(x<rx-r||x>rx+r)
            if(x<rx-r)rx-=r;
            if(x>rx+r)rx+=r;
            ans=pi/2+sqrt((x-rx)*(x-rx)+(y-ry)*(y-ry));
        
        printf("%.4lf\n",ans);
    
    return 0;
View Code

L.Swap

题意:一个排列可以交换前n/2与后n/2,或前n^1个数奇数位置和偶数位置交换,问通过这两个操作最多产生多少个不同的排列

思路:打表发现从第五项开始是2n, n, 12, 4的规律。或者直接交上打表的模拟,由于只有两条链,而且只有一组数据,也能过

代码:

技术图片
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional>
     
#define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x))
 
using namespace std;
 
typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL;
 
const db eps = 1e-6;
const int mod = 1e9+7;
const int maxn = 1e6+100;
const int maxm = 6e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);

int n;
int a[maxn],b[maxn];
int ans;
void gao1(int a[])
    int l = 1;
    int r = n/2+1;
    if(n&1)r++;
    for(int i = 1; i <= n/2; i++)
        swap(a[l+i-1],a[r+i-1]);
    
    return;

void gao2(int a[])
    for(int i = 1; i+1 <= n; i+=2)
        //printf("  %d %d %d\n",i,a[i],a[i+1]);
        swap(a[i],a[i+1]);
    
    return;


int sv(int n)
    ::n=n;
    ans=1;
    int sta=1;
    for(int i = 1; i <= n; i++)a[i]=b[i]=i;
    /*if(n==1)return 1;
    if(n==2)return 2;
    if(n==3)return 6;*/
    gao1(a);gao2(b);
    //for(int i = 1; i <= n; i++)printf("%d ",a[i]);printf("\n");
    //for(int i = 1; i <= n; i++)printf("%d ",b[i]);printf("\n");
    while(1)
        //for(int i = 1; i <= n; i++)printf("%d ",a[i]);printf("\n");
        //for(int i = 1; i <= n; i++)printf("%d ",b[i]);printf("\n");
        int ys = 0;
        sta^=1;
        for(int i = 1; i <= n; i++)
            if(a[i]!=b[i])ys=1;
        
        if(!ys)
            ans++;break;
        
        else
            ans+=2;
            if(sta) gao1(a);gao2(b);
            else gao1(b);gao2(a);
        
    
    return ans;

int main() 
    //scanf("%d" ,&n);
    //sv(3);
    for(int i = 1; i <= 100; i++)
        printf("%d %d\n",i,sv(i));
    
    scanf("%d", &n);
    //for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
        printf("%d",sv(n));
    return 0;
View Code

 

以上是关于2019icpc西安邀请赛的主要内容,如果未能解决你的问题,请参考以下文章

2019 icpc西安邀请赛 点分治

2019 ICPC全国邀请赛(西安)I. Cracking Password(序列检验,BSGS,细节题)

2019ICPC西安邀请赛(计蒜客复现赛)总结

2019ICPC西安邀请赛 E. Tree 树剖 + 线段树

2019icpc西安邀请赛 J And And And (树形dp)

The 2019 ACM-ICPC China Shannxi Provincial Programming Contest (西安邀请赛重现) J. And And And