Educational Codeforces Round 1(远古edu计划)

A.

高斯求和,如果2次幂小于n就减2次

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
int a[N];
int f[N],vis[N];
ll sn(ll a1,ll an,ll num){return (a1+an)*num/2;}
void init(){
    f[1]=1;
    for(int i=2;i<=32;i++){
        f[i]=f[i-1]*2;
    }
}
void lan(){
    ll n;
    cin>>n;
    ll ans=0;
    ans=sn(1,n,n);
    int pos=1;
    while(f[pos]<=n){
        ans-=f[pos]*2;
        pos++;
    }
    cout<<ans<<'\n';

}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    init();
    int q;
    cin>>q;
    while(q--){
        lan();
    }
    return 0;
}

B.

知道周期是r-l+1,模拟一下就好了,超过周期mod一下

学到了一个rotate(起始点的前一个,终止点,旋转到这个点的后面,之前的片段删除)

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long long ll;
const int N=2e5+9;
char t[N];
string s;
void work(int l,int r,int k){//模拟过程
    int len=r-l+1;//周期是长度
    for(int i=l;i<=r;i++){
        t[(i-l+k)%len]=s[i];//模拟移动超过k回到l自然modlen
    }
    for(int i=l;i<=r;i++){
        s[i]=t[i-l];//转移
    }
    return;
}
void lan(){
    cin>>s;
    int m;
    cin>>m;
    while(m--){
        int l,r,k;
        cin>>l>>r>>k;
        //l从1开始,s从0开始要对应索引
        work(l-1,r-1,k);
        // rotate(s.begin()+l-1,s.begin()+r-k,s.begin()+r);
    }
    cout<<s<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q=1;
    while(q--){
        lan();
    }
    return 0;
}

C.

极角排序,找最小的差值即可

1.atan

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;//防止精度问题
const int N=2e5+9;
const ld pi=acos(-1);//arccos-1==pi,cos(pi)==-1
struct node{
    int x,y,id;
    ld ang;//弧度
}a[N];
bool cmp(node a,node b){
    return a.ang<b.ang;//极角排序
}
ld calc(node x){
    ld xi=abs(x.x),yi=abs(x.y);
    if(x.x>=0&&x.y>=0) return atan(xi/yi)*180/pi;//第一象限
    if(x.x>=0&&x.y<0) return atan(yi/xi)*180/pi+90;//第二象限
    if(x.x<0&&x.y<0) return atan(xi/yi)*180/pi+180;//第三象限
    if(x.x<0&&x.y>=0) return atan(yi/xi)*180/pi+270;//第四象限
}
void lan(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
        a[i].id=i;
    }
    for(int i=1;i<=n;i++){
        a[i].ang=calc(a[i]);
    }
    sort(a+1,a+1+n,cmp);
    int pos=n;
    ld ans=min(a[n].ang-a[1].ang,360-a[n].ang+a[1].ang);
    for(int i=1;i<=n-1;i++){
        ld res=min(a[i+1].ang-a[i].ang,360-a[i+1].ang+a[i].ang);
        if(res<ans){//找差值小的
            ans=res;
            pos=i;
        }
    }
    cout<<a[pos].id<<" "<<a[pos%n+1].id<<'\n';
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int q=1;
    while(q--){
        lan();
    }
    return 0;
}

2.atan2

#include<bits/stdc++.h>
#define INF 1e9
using namespace std;
typedef long double ld;
vector<pair<ld,int> > a;
int n,ansx,ansy;
ld sum=INF;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        ld x,y;
        cin>>x>>y;
        a.push_back({atan2(y,x),i+1});//辐角
    }
    sort(a.begin(),a.end());//排序
    a.push_back(a[0]);
    for(int i=0;i<n;i++){
        ld x=a[i+1].first-a[i].first;
        if(x<0)x+=2*acos(-1);//加一个周期
        if(x<sum)sum=x,ansx=a[i].second,ansy=a[i+1].second;//找最小差值
    }
    printf("%d %d",ansx,ansy);
    return 0;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值