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;
}