Codeforces Round 271(Div. 2)


layout: post
title: Codeforces Round 271(Div. 2)
author: "luowentaoaa"
catalog: true
tags:
mathjax: true
- codeforces
- 幾何c++


傳送門post

C.Captain Marmot (幾何,點旋轉)

思路

其中順時針旋轉爲負,逆時針旋轉爲正,角度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

Flowers (DP)

思路

少於k的確定全是1由於都只能放紅色。

大於K的能夠放紅色\(dp[i-1]\) 或者連續的k個白色\(dp[i-k]\)

E - Pillars (DP+線段樹+離散化)

思路

很明顯的DP,可是數值太大,因此考慮離散化 然線段樹取區間最大值

F - Ant colony (線段樹區間gcd,線段樹求最小值的個數)

思路

題意就是查詢區間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;
}
相關文章
相關標籤/搜索