hdu 2688 Rotate 樹狀陣列

2021-07-14 18:10:37 字數 975 閱讀 1040

題目連線:hdu_2688_rotate

題意:給你n數,(n<=3e6),有兩個操作,q為 當前有多少對數,滿足嚴格遞增,r l,r為旋轉l,r這個區間的數

題解:求嚴格遞增的順序對我們可以反向用樹狀陣列求逆序對,300w的資料還是有點夠嗆,不過這裡求出來也就nlogn,然後對於旋轉操作,因為區間大小不超過1000,我們只需統計該區間的第乙個數和後面的數的關係,如果第乙個數比後面的數大,就ans++,如果小於就ans--,等於就不管,因為是嚴格遞增,然後就是這裡我加入讀入優化,感覺還是沒什麼卵用,反而比不加快,可能我寫的優化不行吧。這題卡常數卡的有點緊,要注意常數優化,還有就是hdoj的穩定性不是很好,同乙個**有時能過,有時不能過

#include#include#define f(i,a,b) for(int i=a;i<=b;++i)

typedef long long ll;

int sum[10010],a[3000010];char op[2];

inline void add(int x,int c)

inline int ask(int x)

int main(){

int n,m;

while(~scanf("%d",&n)){

memset(sum,0,sizeof(sum));

ll ans=0;

f(i,0,n-1)scanf("%d",&a[i]),ans+=ask(a[i]-1),add(a[i],1);

scanf("%d",&m);

f(i,1,m){

scanf("%s",op);

if(op[0]=='q')printf("%i64d\n",ans);

else{

int l,r;

scanf("%d%d",&l,&r);

int now=a[l];

f(i,l+1,r){

if(a[i]>now)ans--;

else if(a[i]

hdu 2688 Rotate 樹狀陣列

include include include include include using namespace std define lowbit x x x const int maxn 3000030 const int maxc 10010 int n,c maxc a maxn void a...

hdu 4998 Rotate(計算幾何)

解題思路 題目大意 給定n個點和n個角度,平面內任意乙個點依次以這些點point i 為旋轉中心,逆時針旋轉 r i 度,求最後相當於繞哪個點旋轉多少度,求這個點的座標以及旋轉的角度。演算法思想 乙個點 x,y 繞另外乙個點 x0,y0 旋轉 r0 度的公式為 x1 x x0 cos r0 y y0...

樹狀陣列 hdu2689 hdu2838

題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...