layout: post
title: Codeforces Round 271(Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 幾何c++
傳送門post
其中順時針旋轉爲負,逆時針旋轉爲正,角度angle是弧度值,如旋轉30度轉換爲弧度爲: \(angle = pi/180 * 30\)。ui
四、度與角度的轉換
根據圓爲\(360 º\),弧度爲\(2π\),即 \(360º = 2π\)spa
4.1 角度轉弧度:\(2π / 360 = π / 180 ≈ 0.0174rad\), 即: \(度數 * (π / 180) = 弧度\)
例如:將30º轉爲弧度rad
$ 30º * (π / 180)= 0.523320 rad $code
4.2 弧度轉角度: \(360 / 2π = 180 / π ≈ 57.3º\), 即: $ 弧度 * (180 / π) = 度數$
例如:將\(0.523320rad\)轉爲度º
$0.523320rad * (180 / π) = 29.9992352688º $ci
若o不是原點,則可先將a點座標轉換爲相對座標計算,計算結果再加上o點座標。get
參與計算的a點座標實際應爲 a - 0,最終計算公式以下:it
\(b.x = ( a.x - o.x)*cos(angle) - (a.y - o.y)*sin(angle) + o.x\)class
\(b.y = (a.x - o.x)*sin(angle) + (a.y - o.y)*cos(angle) + o.y\)test
少於k的確定全是1由於都只能放紅色。
大於K的能夠放紅色\(dp[i-1]\) 或者連續的k個白色\(dp[i-k]\)
很明顯的DP,可是數值太大,因此考慮離散化 然線段樹取區間最大值
題意就是查詢區間GCD 而後求出區間gcd的個數,後面的操做也能夠主席樹寫
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e5+50; int a[maxn]; #define bug cout<<"here"<<endl; struct Tree{ #define ls (o<<1) #define rs ((o<<1)|1) int gcd[maxn<<2],mi[maxn<<2],num[maxn<<2]; void push_up(int o){ gcd[o]=__gcd(gcd[ls],gcd[rs]); } void build(int o,int l,int r){ if(l==r){ mi[o]=gcd[o]=a[l]; num[o]=1; return; } int mid=(l+r)/2; build(ls,l,mid); build(rs,mid+1,r); push_up(o); } int query(int o,int l,int r,int ql,int qr){ if(ql<=l&&qr>=r){ return gcd[o]; } int mid=(l+r)/2; int gc=0; if(ql<=mid)gc=__gcd(gc,query(ls,l,mid,ql,qr)); if(qr>mid)gc=__gcd(query(rs,mid+1,r,ql,qr),gc); return gc; } }tree; int sum[maxn*40],rt[maxn*40]; int lss[maxn*40],rss[maxn*40]; int cnt; void update(int &o,int pre,int l,int r,int val){ o=++cnt; lss[o]=lss[pre];rss[o]=rss[pre]; sum[o]=sum[pre]; if(l==r){sum[o]++;return;} int mid=(l+r)/2; if(val<=mid)update(lss[o],lss[pre],l,mid,val); else update(rss[o],rss[pre],mid+1,r,val); } int query(int o,int l,int r,int val){ if(l==r){ return sum[o]; } int mid=(l+r)/2; if(val<=mid)return query(lss[o],l,mid,val); else return query(rss[o],mid+1,r,val); } int n; int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; update(rt[i],rt[i-1],1,1e9,a[i]); } tree.build(1,1,n); int m; cin>>m; while(m--){ int l,r; cin>>l>>r; int gc=tree.query(1,1,n,l,r); int num=query(rt[r],1,1e9,gc); int num1=query(rt[l-1],1,1e9,gc); cout<<r-l+1-num+num1<<endl; } return 0; }